package 引入annotation优化reflect的应用;

/**
 * @Auther:云尚学Java
 */

import java.lang.reflect.Method;

/**
 * 功能描述：
 * 相当于一个框架类ReflectFrame
 * 需求：写一个"框架"，不能改变该类的任何代码的前提下，可以帮我们创建任意类的对象，并且执行其中任意方法
 * <p>
 * 实现步骤：
    1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
    //配置文件.txt pro.properties
    //Person per = new Person();  eat  反射的中Class对象的创建.Person   eat
    //Student stu = new Student(); sleep 反射的中Class对象的创建.Student  sleep
    2. 在程序中加载读取配置文件Properties
    3. 使用反射技术来加载类文件进内存ClassLoader
    4. 创建对象newInstance();
    5. 执行方法，
    先去获取方法
    getMethod()
    invoke()执行
 */
@Pro(className = "引入annotation优化reflect的应用.Demo2",methodName = "demo2")
public class ReflectFrame1 {
    public static void main(String[] args) throws Exception {
        /**
         * 1.解析注解(获取注解中的内容)
         *        1.1 获取该类的字节码对象
         *           Class<ReflectFrame> reflectFrame = ReflectFrame.class;
         *        1.2 获取上面的注解对象(构建对象)
         *           Pro pro = reflectFrame.getAnnotation(Pro.class);
         *        1.3 使用pro去获取对象 className="AnnoApply.Demo1" methodName="demo1"
         *           String className = pro.className();
         *           String methodName = pro.methodName();
         *        1.4 使用反射对获取到的全类名和方法之上进行需求的满足
         *           Class cls1 = Class.forName(className);//获取Class类对象
         Object obj = cls1.newInstance();//创建对象 ReflectDemo.Person
         //invoke()执行 执行哪一个方法 获取方法  根据得到的方法名称
         Method method = cls1.getMethod(methodName);
         method.invoke(obj);//执行方法
         */
        //1.1 获取该类的字节码对象
        Class<ReflectFrame1> reflectFrame1 = ReflectFrame1.class;

        //1.2 获取上面的注解对象(构建对象)
        Pro pro = reflectFrame1.getAnnotation(Pro.class);

        //1.3 使用pro去获取对象 className="AnnoApply.Demo1" methodName="demo1"
        String className = pro.className();
        String methodName = pro.methodName();
        System.out.println("className:"+className);
        System.out.println("methodName:"+methodName);

        //1.4 使用反射对获取到的全类名和方法之上进行需求的满足
        Class class1 = Class.forName(className);
        Object obj = class1.newInstance();
        Method method = class1.getMethod(methodName);
        method.invoke(obj);
        //执行方法 框架 Servlet 简单  收获越少
        //智能化  封装好  注解  配置 SpringMVC
        //Python 简单  一周
        //胶水语言
        //就业寄语  只会Python 语法  爬虫 人工智能 会Python 人工智能 算法 数学 统计
    }
}
